const CalendarHelper = {}
CalendarHelper.GetCNDate = function (D) {
  var madd = new Array(12)
  var tgString = '甲乙丙丁戊己庚辛壬癸'
  var dzString = '子丑寅卯辰巳午未申酉戌亥'
  var numString = '一二三四五六七八九十'
  var monString = '正二三四五六七八九十冬腊'
  // var weekString = '日一二三四五六'
  var sx = '鼠牛虎兔龙蛇马羊猴鸡狗猪'
  var cYear, cMonth, cDay, TheDate
  var CalendarData = new Array(100)
  CalendarData = [
    0xa4b,
    0x5164b,
    0x6a5,
    0x6d4,
    0x415b5,
    0x2b6,
    0x957,
    0x2092f,
    0x497,
    0x60c96,
    0xd4a,
    0xea5,
    0x50da9,
    0x5ad,
    0x2b6,
    0x3126e,
    0x92e,
    0x7192d,
    0xc95,
    0xd4a,
    0x61b4a,
    0xb55,
    0x56a,
    0x4155b,
    0x25d,
    0x92d,
    0x2192b,
    0xa95,
    0x71695,
    0x6ca,
    0xb55,
    0x50ab5,
    0x4da,
    0xa5b,
    0x30a57,
    0x52b,
    0x8152a,
    0xe95,
    0x6aa,
    0x615aa,
    0xab5,
    0x4b6,
    0x414ae,
    0xa57,
    0x526,
    0x31d26,
    0xd95,
    0x70b55,
    0x56a,
    0x96d,
    0x5095d,
    0x4ad,
    0xa4d,
    0x41a4d,
    0xd25,
    0x81aa5,
    0xb54,
    0xb6a,
    0x612da,
    0x95b,
    0x49b,
    0x41497,
    0xa4b,
    0xa164b,
    0x6a5,
    0x6d4,
    0x615b4,
    0xab6,
    0x957,
    0x5092f,
    0x497,
    0x64b,
    0x30d4a,
    0xea5,
    0x80d65,
    0x5ac,
    0xab6,
    0x5126d,
    0x92e,
    0xc96,
    0x41a95,
    0xd4a,
    0xda5,
    0x20b55,
    0x56a,
    0x7155b,
    0x25d,
    0x92d,
    0x5192b,
    0xa95,
    0xb4a,
    0x416aa,
    0xad5,
    0x90ab5,
    0x4ba,
    0xa5b,
    0x60a57,
    0x52b,
    0xa93,
    0x40e95
  ]
  madd[0] = 0
  madd[1] = 31
  madd[2] = 59
  madd[3] = 90
  madd[4] = 120
  madd[5] = 151
  madd[6] = 181
  madd[7] = 212
  madd[8] = 243
  madd[9] = 273
  madd[10] = 304
  madd[11] = 334
  function GetBit(m, n) {
    return (m >> n) & 1
  }

  function e2c() {
    TheDate = arguments.length !== 3 ? new Date() : new Date(arguments[0], arguments[1], arguments[2])
    var total, m, n, k
    var isEnd = false
    var tmp = TheDate.getFullYear()
    if (tmp < 1900) {
      tmp += 1900
    }
    total = (tmp - 1921) * 365 + Math.floor((tmp - 1921) / 4) + madd[TheDate.getMonth()] + TheDate.getDate() - 38
    if (TheDate.getFullYear() % 4 === 0 && TheDate.getMonth() > 1) {
      total++
    }
    for (m = 0; ; m++) {
      k = CalendarData[m] < 0xfff ? 11 : 12
      for (n = k; n >= 0; n--) {
        if (total <= 29 + GetBit(CalendarData[m], n)) {
          isEnd = true
          break
        }
        total = total - 29 - GetBit(CalendarData[m], n)
      }
      if (isEnd) break
    }
    cYear = 1921 + m
    cMonth = k - n + 1
    cDay = total
    if (k === 12) {
      if (cMonth === Math.floor(CalendarData[m] / 0x10000) + 1) {
        cMonth = 1 - cMonth
      }
      if (cMonth > Math.floor(CalendarData[m] / 0x10000) + 1) {
        cMonth--
      }
    }
  }

  function GetcDateString() {
    var tmp = ''
    tmp += tgString.charAt((cYear - 4) % 10)
    tmp += dzString.charAt((cYear - 4) % 12)
    tmp += '('
    tmp += sx.charAt((cYear - 4) % 12)
    tmp += ')年 '
    if (cMonth < 1) {
      tmp += '(闰)'
      tmp += monString.charAt(-cMonth - 1)
    } else {
      tmp += monString.charAt(cMonth - 1)
    }
    tmp += '月'
    tmp += cDay < 11 ? '初' : cDay < 20 ? '十' : cDay < 30 ? '廿' : '三十'
    if (cDay % 10 !== 0 || cDay === 10) {
      tmp += numString.charAt((cDay - 1) % 10)
    }
    return tmp
  }

  function GetLunarDay(solarYear, solarMonth, solarDay) {
    // solarYear = solarYear<1900?(1900+solarYear):solarYear;
    if (solarYear < 1921 || solarYear > 2050) {
      return ''
    } else {
      solarMonth = parseInt(solarMonth) > 0 ? solarMonth - 1 : 11
      e2c(solarYear, solarMonth, solarDay)
      return GetcDateString()
    }
  }
  var yy = D.getFullYear()
  var mm = D.getMonth() + 1
  var dd = D.getDate()
  // var ww = D.getDay()
  // var ss = parseInt(D.getTime() / 1000)
  if (yy < 100) yy = '19' + yy
  return GetLunarDay(yy, mm, dd)
}

CalendarHelper.GetAddDay = function (D, v) {
  var LstrNdate = D
  var LstrYear = LstrNdate.getFullYear()
  var LstrMonth = LstrNdate.getMonth()
  var LstrDate = LstrNdate.getDate()
  // 处理
  var uom = new Date(LstrYear, LstrMonth, LstrDate)
  uom.setDate(uom.getDate() + v) // 取得系统时间的前一天,重点在这里,负数是前几天,正数是后几天
  return uom
}

// 是否除夕
CalendarHelper.IsLastDayBeforeNewYearOfCN = function (D) {
  // D => Sun Nov 29 2020 00:00:00 GMT+0800 (中国标准时间)
  var strCurrDay = CalendarHelper.GetCNDate(D)
  var strNextDay = CalendarHelper.GetCNDate(CalendarHelper.GetAddDay(D, 1))
  // alert(strCurrDay+","+strNextDay);
  return strCurrDay.split('年')[0] !== strNextDay.split('年')[0]
}

// 是否春节
CalendarHelper.IsNewYearOfCN = function (D) {
  // D => Sun Nov 29 2020 00:00:00 GMT+0800 (中国标准时间)
  var strCurrDay = CalendarHelper.GetCNDate(D)
  // var strPrevDay = CalendarHelper.GetCNDate(CalendarHelper.GetAddDay(D, -1))
  // alert(strCurrDay+","+strPrevDay);
  // return strCurrDay.split('年')[0] !== strPrevDay.split('年')[0]
  let strArr = ['正月初一', '正月初二', '正月初三', '正月初四', '正月初五', '正月初六', '正月初七', '正月初八', '正月初九']
  if (strArr.indexOf(strCurrDay.split(' ')[1]) !== -1) {
    return true
  } else {
    return false
  }
}

// 是否公司年假
CalendarHelper.IsAnnualLeaveCN = function (D) {
  // D => Sun Nov 29 2020 00:00:00 GMT+0800 (中国标准时间)
  var strCurrDay = CalendarHelper.GetCNDate(D)
  // var strPrevDay = CalendarHelper.GetCNDate(CalendarHelper.GetAddDay(D, -1))
  // alert(strCurrDay+","+strPrevDay);
  // return strCurrDay.split('年')[0] !== strPrevDay.split('年')[0]
  let strArr = ['腊月廿四', '腊月廿五', '腊月廿六', '腊月廿七', '腊月廿八', '腊月廿九']
  if (strArr.indexOf(strCurrDay.split(' ')[1]) !== -1) {
    return true
  } else {
    return false
  }
}

// 是否公司补班
CalendarHelper.IsOTCN = function (D) {
  // D => Sun Nov 29 2020 00:00:00 GMT+0800 (中国标准时间)
  var strCurrDay = CalendarHelper.GetCNDate(D)
  // var strPrevDay = CalendarHelper.GetCNDate(CalendarHelper.GetAddDay(D, -1))
  // alert(strCurrDay+","+strPrevDay);
  // return strCurrDay.split('年')[0] !== strPrevDay.split('年')[0]
  let strArr = ['正月初十']
  if (strArr.indexOf(strCurrDay.split(' ')[1]) !== -1) {
    return true
  } else {
    return false
  }
}

export default CalendarHelper
